模板泛型编程在实际应用中,经常需要对不同类型的变量进行相同的操作,虽然函数重载可以实现,但是有几个不好的地方
一是重载函数仅是类型不同,代码复用率较低,一旦有新类型出现,就需要重新写一遍函数
二是代码的可维护性降低,其中一个地方出错就导致所有的重载均出错
于是C++在3.0版本中提出了模板,也就是一种泛型编程,不具体限定数据类型
泛型编程:编写与类型无关的通用代码,是代码复用的一种手段。模板是泛型编程的基础
模板又分为函数模板和类模板
函数模板格式template<class T1, typename T2, …… ,typename Tn>返回值类型 函数名(参数列表){}
1234567template<class T>void swap(T& left, T& right){ T tmp = left; left = right; right = tmp;}
这里的class也可以用tpyename代替
原理在编译阶段,对于模板函数,编译器需要根据传入的实参类型来推演生成对应类型的函数来调用
函数模板的实例化我们...
C++ 内存管理方式C语言中的内存管理方式在C++中仍然可以继续使用,但是也有很多地方并不好用,例如栈的生成与销毁,用起来比较复杂,因此C++提出了自己的内存管理方式,通过new和delete来进行动态内存管理
new delete 操作内置类型123456789101112131415void fun(){ int* p1 = new int; // 这里直接申请一个int的空间 int* p2 = new int(10); // 这里申请一个int的空间并且初始化为 10 int* p3 = new int[10]; // 这里申请10个int的空间 delete p1; delete p2; delete[] p3;}
包括 malloc 和 free 这些申请与销毁空间的操作必须匹配起来使用,切忌混用
new delete 操作自定义类型1234567891011121314151617181920212223class A{public: A(int a = 0) :_a(a) { cout<<"A(in...
面向过程与面向对象C语言是面向过程的,关注的是做一件事情的需要的步骤有哪些,通过一系列函数之间的调用配合来实现解决问题
例如打游戏,需要 拿出电脑,开机,联网,登录,进入游戏这几个步骤
C++是基于面向对象的,关注的是解决这一个问题参与的对象,依靠对象之间的交互来完成问题的解决
例如打游戏,对象就是电脑和人,对于电脑这个对象,内部可能有一些机理,比如联网,登录,对于人也有一些机理,例如肌肉运动之类的,这就类似于类中的函数
类C语言中的结构体只能定义变量,但是在C++中,结构体中还可以定义函数,那么其实对于C++来说结构体也是一个类,而在C++中更常用class表示真正的类
类的定义12345678class ClassName{ void fun() { } int a;};//注意分号
class为定义类的关键字,ClassName是类的名字,**{}是类的主体,之中是类的成员,包括成员变量和成员函数**
类的两种定义方式
声明和定义全都在类中定义,成员函数可能会被当成内联函数处理
123456789101112class stud...
1. C++关键字C++共计63个关键字,其中c语言有32个
1234567891011asm do if return try continueauto double inline short typedef forbool dynamic_cast int signed typename throwbreak else long sizeof typeid publiccase enum mutable static union wchar_tcatch explicit namespace static_cast unsigned defaultchar export new struct using friendclass extern operator switch virtual registerconst false private template void trueconst_cast float protected this volatile whiledelete goto reinterpret_cast
2. 命名空间在C/C++中,变量、函数...
介绍栈栈是一种基础的数据结构,具有一些特定的性质,例如先进后出,压栈出栈等,对于这些性质,一般可以采用顺序表来实现,当然也可用链表
队列队列具有的性质是先进先出,队尾进,队头出,这很符合链表的特性,所以我们采用单链表来实现队列
实现栈头文件123456789101112131415161718192021222324252627282930313233#pragma once#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>#include<stdlib.h>#include<memory.h>#include<stdbool.h>#include<assert.h>// 支持动态增长的栈typedef int STDataType;typedef struct Stack{ STDataType* a;// 这里采用顺序表的结构,也可以采用数组 int top; // 栈顶 int capacity; // 容量 }Stack;// 初始化栈 v...
双链表这里的双链表指带头循环双向链表
虽然数据结构本身比较复杂,但是增删查改比较方便,是一个比较独立的数据结构
头文件声明1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253#pragma once// 带头+双向+循环链表增删查改实现#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>#include<stdlib.h>#include<assert.h>#include<memory.h>#include<stdbool.h>#include<math.h>//常见头文件包含typedef int LTDataType;typedef struct ListNode{ LTDataType data;//链表数据 struct ListNode* next;//指向下一个节点的指针 struct ListNo...
字符指针12345678int main(){ char ch = 'w'; char* pc = &ch; *pc = 'w'; return 0;}
这是第一种使用方法,只用来表示一个字符的地址
123456int main(){ const char* pstr = "hello world"; printf("%s\n",pstr); return 0;}
这是第二种用法,与第一种不同,这里的字符指针只是把这个常量字符串的首元素的地址存入的指针中
对于字符数组来说,即便是相同的字符串也会放在不同的地址;对于字符指针来说,C/C++会把常量字符串存储到一个单独的内存中,当字符串内容完全相同的时候,也就会指向同一块内存
指针数组顾名思义,指针数组就是由一组指针组成的数组,例如:
123int* arr1[10];char* arr2[4];char** arr3[5];
数组指针数组指针实际上是指针而非数组
12int* p1[...
主文件123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354#include"game.h" //基本思路 //游戏菜单 //初始化 //打印 //放置雷 //记录void menu(){ printf("*******************************\n"); printf("**********1. 开始游戏**********\n"); printf("**********0. 退出游戏**********\n"); printf("*******************************\n");}void game(){ char Lay[ROWS][COLS]; char Find[ROWS][COLS]; ...